/**
 * 封装echarts 工具 
 */
/**
 * 数组中是否存在某个对象
 * @param array
 * @returns {Boolean}
 */
Array.prototype.contains = function (obj) {
	var i = this.length;
	while (i--) {
		if (this[i] === obj) {
			return true;
		}
	}
	return false;
};
/**
 * 数组中最大值 最小值
 * @param array
 * @returns
 */
Array.prototype.max = function () {
	return Math.max.apply({}, this);
};
Array.prototype.min = function () {
	return Math.min.apply({}, this);
};
var DHEcharts = {
	EchartsDataFormat: { //整理数据格式
		NoGroupFormat: function (data) { //整理数据没有分组类型的，适合饼图
			//category 的数据存储
			var categorys = [];
			//data 的数据存储
			var datas = [];
			//遍历
			for (var i = 0; i < data.length; i++) {
				categorys.push(data[i].name || "");
				//定义一个中间变量
				var temp_data = {
					value: data[i].value || 0,
					name: data[i].name || ""
				};
				datas.push(temp_data);
			}
			return {
				categorys: categorys,
				data: datas
			};
		},
		//数据格式：group：XXX，name：XXX，value：XXX
		/**
		 * @param data : json数据
		 * @param type : 图表类型
		 * var data1 = [ 
		 *    { group:'类型1' , name: '1月', value: 10 }, 
		 *    { group:'类型2' , name: '1月', value: 15 }, 
		 *    { group:'类型1' , name: '2月', value: 25 }, 
		 *    { group:'类型2' , name: '2月', value: 12 }, 
		 *    { group:'类型1' , name: '3月', value: 22 }, 
		 *    { group:'类型2' , name: '3月', value: 12 }, 
		 *    ];
		 */
		GroupFormat: function (data, type) { //整理数据有分组类型的，适合折线图、柱形图（分组，堆积） 
			//用于存储类型名称
			var groups = new Array();
			//用于存储data.name数据
			var names = new Array();
			//存储返回series数据 （一个或者多个）
			var series = new Array();
			//用于存储type类型
			var types = new Array();
			//用于存储yAxisIndex
			var yAxisIndexs = new Array();
			for (var i = 0; i < data.length; i++) {
				//判断data[i].group是否存在数租groups中
				if (!groups.contains(data[i].group)) {
					//不存在则跳进 存放
					groups.push(data[i].group);
				}

				//判断name数据是否存在 数组names中
				if (!names.contains(data[i].name)) {
					//不存在则跳进 存放
					names.push(data[i].name);
				}
				if (data[i].type) types.push(data[i].type);
				if (data[i].yAxisIndex) {
					yAxisIndexs.push(data[i].yAxisIndex);
				} else {
					yAxisIndexs.push(0)
				}
			}
			//遍历分类
			for (var i = 0; i < groups.length; i++) {
				//定义一个series中间变量
				var temp_series = {};
				//定义data.value数据存储
				var temp_data = new Array();
				//遍历所有数据
				for (var j = 0; j < data.length; j++) {
					//遍历data.name数据
					for (var k = 0; k < names.length; k++) {
						//判断所有分类中的所有数据含name数据分开
						if (groups[i] == data[j].group && names[k] == data[j].name) {
							temp_data.push(data[j].value);
						}
					}
				}
				var etype = types[i] ? types[i] : type;
				temp_series = {
					name: groups[i],
					type: etype,
					data: temp_data,
					yAxisIndex: yAxisIndexs[i],
					label: {
						normal: {
							show: true,
							position: 'top'
						}
					}
				};
				series.push(temp_series);

			}
			return {
				groups: groups,
				category: names,
				series: series
			};
		},
		/**
		 * 折柱混合图数据格式化
		 */
		MixLineBarFormat: function (data) {
			var legend = [],
				xAxis = [],
				series = [],
				series2 = [];
			if (data.length) legend = [data[0].title || "", data[0].title2 || ""];
			for (var i = 0; i < data.length; i++) {
				xAxis.push(data[i].name);
				series.push(data[i].value);
				series2.push(data[i].value2);
			}
			return {
				legend: legend, //['金额（万元）', '数量']
				xAxis: xAxis, //['2021-12-05', '2021-12-06', '2021-12-07', '2021-12-08', '2021-12-09', '2021-12-10', '2021-12-11']
				series: series, //[25, 243.4, 200, 364, 670.2, 117, 221]
				series2: series2 //[5, 13, 5, 15, 13, 3, 5]
			}
		},
		/**
		 * 雷达图数据格式化
		 */
		RadarFormat: function (data, type) {
			//用于存储类型名称
			var groups = new Array();
			//用于存储data.name数据
			var names = new Array();
			//存储最大值数组
			var indicators = new Array();
			//定义data.value数据存储
			var temp_data = new Array();
			for (var i = 0; i < data.length; i++) {
				//判断data[i].group是否存在数租groups中
				if (!groups.contains(data[i].group)) {
					//不存在则跳进 存放
					groups.push(data[i].group);
				}

				//判断name数据是否存在 数组names中
				if (!names.contains(data[i].name)) {
					//不存在则跳进 存放
					names.push(data[i].name);
				}
			}
			for (var i = 0; i < names.length; i++) {
				//中
				var temp_maxValue = new Array();
				for (var j = 0; j < data.length; j++) {
					if (names[i] == data[j].name) {
						temp_maxValue.push(data[j].value);
					}
				}
				indicators.push({
					name: names[i],
					max: Number(temp_maxValue.max() * 2 / 1.5).toFixed(2)
				})
			}
			//遍历分类
			for (var i = 0; i < groups.length; i++) {
				//定义一个series中间变量
				var temp_series = {};
				//定义datavalue数组
				var dataValues = new Array();
				//遍历所有数据
				for (var j = 0; j < data.length; j++) {
					if (groups[i] == data[j].group) {
						dataValues.push(data[j].value);
					}
				}
				temp_data.push({
					value: dataValues,
					name: groups[i]
				});
			}
			series = {
				type: type,
				data: temp_data
			};
			return {
				indicators: indicators,
				groups: groups,
				category: names,
				series: series
			};
		},
		/**
		 * 漏斗图数据格式化
		 */
		FunnelFormat: function (data, type) {
			//用于存储类型名称
			var groups = new Array();
			//用于存储data.name数据
			var names = new Array();
			//定义一个存放series的数组
			var series = new Array();
			for (var i = 0; i < data.length; i++) {
				//判断data[i].group是否存在数租groups中
				if (!groups.contains(data[i].group)) {
					//不存在则跳进 存放
					groups.push(data[i].group);
				}

				//判断name数据是否存在 数组names中
				if (!names.contains(data[i].name)) {
					//不存在则跳进 存放
					names.push(data[i].name);
				}
			}
			var width = parseInt(100 / groups.length);
			//遍历分类
			for (var i = 0; i < groups.length; i++) {
				//定义data.value数据存储
				var temp_data = new Array();
				var k = 0;
				//遍历所有数据
				for (var j = 0; j < data.length; j++) {
					//判断所有分类中的所有数据含name数据分开
					if (groups[i] == data[j].group) {
						k++;
						temp_data.push({
							value: k,
							name: data[j].name + "：" + data[j].value
						});
					}
				}
				var left = width * i ? width * i : 8;
				series.push({
					name: groups[i],
					type: type,
					sort: 'ascending',
					grap: 2,
					left: left + "%",
					top: '18%',
					width: width - 30 + "%",
					label: {
						normal: {
							show: true,
							position: 'inside'
						},
						emphasis: {
							textStyle: {
								fontSize: 20
							}
						}
					},
					data: temp_data
				});
			}
			return {
				groups: groups,
				category: names,
				series: series
			};
		},
		/**
		 * 仪表盘图数据格式化
		 */
		GaugeFormat: function (data, type) {
			var temp_datas = [{
				value: data.value,
				name: data.name
			}];
			var names = data.name;
			//判断最大值和最小值几位数
			maxNum = Number(parseInt(data.value)).toString().length;
			minNum = Number(parseInt(data.value)).toString().length;
			if (minNum <= 2) {
				min = 0;
			} else {
				//最小值
				min = Math.pow(10, (maxNum - 1));
			}
			//最大值
			max = Math.pow(10, maxNum);
			var series = new Array();
			series.push({
				name: data.group,
				type: type,
				min: min,
				max: max,
				radius: '70%',
				startAngle: 180,
				endAngle: -0,
				axisLine: { // 坐标轴线
					lineStyle: { // 属性lineStyle控制线条样式
						color: [
							[0.09, 'lime'],
							[0.82, '#1e90ff'],
							[1, '#ff4500']
						],
						width: 3,
						shadowColor: '#fff', //默认透明
						shadowBlur: 10
					}
				},
				axisLabel: { // 坐标轴小标记
					textStyle: { // 属性lineStyle控制线条样式
						fontWeight: 'bolder',
						color: '#444',
						shadowColor: '#fff', //默认透明
						shadowBlur: 10
					}
				},
				axisTick: { // 坐标轴小标记
					length: 15, // 属性length控制线长
					lineStyle: { // 属性lineStyle控制线条样式
						color: 'auto',
						shadowColor: '#fff', //默认透明
						shadowBlur: 10
					}
				},
				splitLine: { // 分隔线
					length: 25, // 属性length控制线长
					lineStyle: { // 属性lineStyle（详见lineStyle）控制线条样式
						width: 3,
						color: 'auto',
						shadowColor: '#fff', //默认透明
						shadowBlur: 10
					}
				},
				pointer: { // 分隔线
					shadowColor: '#fff', //默认透明
					shadowBlur: 5
				},
				// title: { //标题组件
				// 	offsetCenter: ['-10%', '30%'],
				// 	textStyle: { // 其余属性默认使用全局文本样式，详见TEXTSTYLE
				// 		fontWeight: 'bolder',
				// 		fontSize: 14,
				// 		fontStyle: 'italic',
				// 		color: '#',
				// 		shadowColor: '#fff', //默认透明
				// 		shadowBlur: 10
				// 	}
				// },
				detail: {
					backgroundColor: 'rgba(30,144,255,0.8)',
					borderWidth: 1,
					borderColor: '#fff',
					shadowColor: '#fff', //默认透明
					shadowBlur: 5,
					fontSize: 14,
					offsetCenter: ['20%', '30%'], // x, y，单位px
					textStyle: { // 其余属性默认使用全局文本样式，详见TEXTSTYLE
						fontWeight: 'bolder',
						color: '#fff'
					}
				},
				data: temp_datas
			});
			return {
				category: names,
				series: series
			};
		}
	},
	//生成图形option
	EchartsOption: {
		/**
		 * 饼图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 * 
		 */
		pie: function (title, subtext, data) {
			//数据格式
			var datas = DHEcharts.EchartsDataFormat.NoGroupFormat(data);
			option = {
				// title: { //标题组件
				// 	text: title || "", //标题
				// 	subtext: subtext || "", //副标题
				// 	x: 'center', //位置默认居中
				// },
				tooltip: { //提示框组件
					show: true,
					trigger: 'item',
				},
				legend: { //图例组件
					orient: 'horizontal', //垂直：vertical； 水平 horizontal
					// top: 'center',    //位置默认左
					// bottom:'15%',
					data: datas.categorys
				},
				label: {
					formatter: '{b} , {c}'
				},
				series: [{
					name: title || "",
					type: 'pie', //类型
					// radius : '80%', //圆的大小
					radius: ['45%', '80%'], //圆的大小
					// center : ['50%', '50%'],//位置居中
					data: datas.data,
					itemStyle: {
						emphasis: {
							shadowBlur: 10,
							shadowOffsetX: 0,
							shadowColor: 'rgba(0, 0, 0, 0.5)'
						}
					},
					labelLine: { //引导线
						show: true,
						length: 20
					},
					label: {
						formatter: ' {b|{b}：}{c} {per|{d}%} ',
						backgroundColor: '#F6F8FC',
						borderColor: '#8C8D8E',
						borderWidth: 1,
						borderRadius: 4,
						rich: {
							a: {
								color: '#6E7079',
								lineHeight: 20,
								align: 'center'
							},
							b: {
								color: '#4C5058',
								fontSize: 14,
								fontWeight: 'bold',
								lineHeight: 23
							},
							per: {
								color: '#fff',
								backgroundColor: '#4C5058',
								padding: 3,
								borderRadius: 4
							}
						}
					},
				}]
			};
			return option;
		},
		/**
		 * 柱形图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 * @param vAxis_val:yAxis默认纵向、xAxis横向
		 */
		bar: function (title, subtext, data, vAxis_val = 'yAxis', ylist = [{
			type: 'value'
		}]) {
			var datas = DHEcharts.EchartsDataFormat.GroupFormat(data, 'bar');
			var option = {
				// title: { //标题组件
				// 	text: title || "", //标题
				// 	subtext: subtext || "", //副标题
				// 	x: 'center', //位置默认居中
				// },
				tooltip: { //提示框组件
					show: true,
					trigger: 'item',
					formatter: function (params) {
						var seriesName = '';
						if (params.seriesName.indexOf("series") < 0) seriesName = params.seriesName + ' <br/>'; //系列名称(group)为空不显示
						return seriesName + params.name + ' : ' + params.value;
					}
				},
				legend: { //图例组件
					orient: 'vertical', //垂直：vertical； 水平 horizontal
					left: 'left', //位置默认左
					data: datas.groups
				},
				series: datas.series
			};
			if (vAxis_val == 'xAxis') {
				//水平坐标
				option['xAxis'] = [{
					type: 'value'
				}];
				//垂直坐标
				option['yAxis'] = [{
					type: 'category',
					data: datas.category,
					inverse: true, //倒叙
					axisLabel: {
						interval: 0, //标签设置为全部显示
						formatter: function (params) {
							var newParamsName = ""; // 最终拼接成的字符串
							var paramsNameNumber = params.length; // 实际标签的个数
							var provideNumber = 6; // 每行能显示的字的个数
							var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话，需要显示几行，向上取整
							/**
							 * 判断标签的个数是否大于规定的个数， 如果大于，则进行换行处理 如果不大于，即等于或小于，就返回原标签
							 */
							// 条件等同于rowNumber>1
							if (paramsNameNumber > provideNumber) {
								/** 循环每一行,p表示行 */
								for (var p = 0; p < rowNumber; p++) {
									var tempStr = ""; // 表示每一次截取的字符串
									var start = p * provideNumber; // 开始截取的位置
									var end = start + provideNumber; // 结束截取的位置
									// 此处特殊处理最后一行的索引值
									if (p == rowNumber - 1) {
										// 最后一次不换行
										tempStr = params.substring(start, paramsNameNumber);
									} else {
										// 每一次拼接字符串并换行
										tempStr = params.substring(start, end) + "\n";
									}
									newParamsName += tempStr; // 最终拼成的字符串
								}

							} else {
								// 将旧标签的值赋给新标签
								newParamsName = params;
							}
							//将最终的字符串返回
							return newParamsName
						}
					}
				}];
				$.each(option['series'], function (i, v) {
					option['series'][i]['label'] = {
						normal: {
							show: true,
							position: 'right'
						}
					};
				})

			} else {
				//垂直坐标
				// option['yAxis'] = [
				//     {
				//         type: 'value'
				//     }
				// ];
				option['yAxis'] = ylist;
				//水平坐标
				option['xAxis'] = [{
					type: 'category',
					data: datas.category
				}];
			}
			return option;
		},

		/**
		 * 折线图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 */
		line: function (title, subtext, data) {
			var datas = DHEcharts.EchartsDataFormat.GroupFormat(data, 'line');
			var option = {
				// title: { //标题组件
				// 	text: title || "", //标题
				// 	subtext: subtext || "", //副标题
				// 	x: 'center', //位置默认居中
				// },
				tooltip: { //提示框组件
					show: true,
					trigger: 'axis',
				},
				legend: { //图例组件
					orient: 'vertical', //垂直：vertical； 水平 horizontal
					left: 'right', //位置默认右
					data: datas.groups
				},
				grid: {
					left: '10%',
					top: '25%',
					right: '10%',
					bottom: '25%',
				},
				//水平坐标
				xAxis: [{
					type: 'category',
					data: datas.category,
					boundaryGap: false,
					splitLine: {
						show: true,
					},
				}],
				//垂直坐标
				yAxis: [{
					type: 'value'
				}],
				//series数据
				series: datas.series
			};
			return option;
		},
		/**
		 * 雷达图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 */
		Radar: function (title, subtext, data) {
			var datas = DHEcharts.EchartsDataFormat.RadarFormat(data, 'radar');
			var option = {
				// title: { //标题组件
				// 	text: title || "", //标题
				// 	subtext: subtext || "", //副标题
				// 	x: 'center', //位置默认居中
				// },
				tooltip: { //提示框组件
					show: true,
				},
				legend: { //图例组件
					orient: 'vertical', //垂直：vertical； 水平 horizontal
					left: 'left', //位置默认左
					data: datas.groups
				},
				radar: {
					name: {
						textStyle: {
							color: '#fff',
							backgroundColor: '#999',
							borderRadius: 3,
							padding: [3, 5]
						}
					},
					indicator: datas.indicators
				},
				series: datas.series
			};
			return option;
		},
		/**
		 * 漏斗图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 */
		funnel: function (title, subtext, data) {
			var datas = DHEcharts.EchartsDataFormat.FunnelFormat(data, 'funnel');
			var option = {
				// title: { //标题组件
				// 	text: title || "", //标题
				// 	subtext: subtext || "", //副标题
				// 	x: 'center', //位置默认居中
				// },
				tooltip: { //提示框组件
					show: true,
					trigger: 'item',
					formatter: "{b}"
				},
				legend: { //图例组件
					orient: 'vertical', //垂直：vertical； 水平 horizontal
					left: 'left', //位置默认左
					data: datas.groups
				},
				series: datas.series
			};
			return option;
		},
		/**
		 * 仪表图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 */
		gauge: function (title, subtext, data) {
			var datas = DHEcharts.EchartsDataFormat.GaugeFormat(data, 'gauge');
			var option = {
				// title: { //标题组件
				// 	text: title || "", //标题
				// 	subtext: subtext || "", //副标题
				// 	x: 'center', //位置默认居中
				// },
				tooltip: { //提示框组件
					show: true,
					formatter: "{a} <br/>{b}:{c}"
				},
				series: datas.series
			};
			return option;
		},
		/**
		 * 折柱混合图
		 * @param title ： 标题
		 * @param subtext ：副标题
		 * @param data : json 数据
		 */
		mixLineBar: function (title, subtext, data) {
			var datas = DHEcharts.EchartsDataFormat.MixLineBarFormat(data);
			var option = {
				tooltip: { //提示框组件
					trigger: 'axis',
					axisPointer: {
						type: 'cross',
						crossStyle: {
							color: '#999'
						}
					}
				},
				//				toolbox: { //工具栏组件
				//					feature: {
				//						dataView: {
				//							show: true,
				//							readOnly: false
				//						},
				//						magicType: {
				//							show: true,
				//							type: ['line', 'bar']
				//						},
				//						restore: {
				//							show: true
				//						},
				//						saveAsImage: {
				//							show: true
				//						}
				//					}
				//				},
			};
			option.xAxis = [{
				type: 'category',
				data: datas.xAxis,
				axisPointer: {
					type: 'shadow'
				}
			}];
			option.yAxis = [{
					type: 'value',
					//					name: '金额（万元）',
					//					min: 0,
					//					max: 250,
					//					interval: 50,
					// axisLabel: {
					//   formatter: '{value} ml'
					// }
				},
				{
					type: 'value',
					//					name: '数量',
					//					min: 0,
					//					max: 25,
					//					interval: 5,
					// axisLabel: {
					//   formatter: '{value} °C'
					// }
				}
			];
			option.legend = { //图例组件
				data: datas.legend
			};
			option.series = [{
					name: datas.legend[0],
					type: 'bar',
					data: datas.series
				},
				{
					name: datas.legend[1],
					type: 'line',
					yAxisIndex: 1,
					data: datas.series2
				}
			];
			return option;
		}
	},
	/**
	 * 初始化图表
	 * @param option : option
	 * @param echartId : 图表的id 需要加引号
	 * @param theme : 默认新增mocaron色
	 */
	initChart: function (option, echartId, theme = 'macarons') {
		var container = eval("document.getElementById('" + echartId + "')");
		var dhChart = echarts.init(container, theme);
		dhChart.setOption(option, true); // 为echarts对象加载数据
		dhChart.resize();
		return dhChart;
	},
	laybelFormat: function (params) {
		var newParamsName = ""; // 最终拼接成的字符串
		var paramsNameNumber = params.length; // 实际标签的个数
		var provideNumber = 4; // 每行能显示的字的个数
		var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话，需要显示几行，向上取整
		/**
		 * 判断标签的个数是否大于规定的个数， 如果大于，则进行换行处理 如果不大于，即等于或小于，就返回原标签
		 */
		// 条件等同于rowNumber>1
		if (paramsNameNumber > provideNumber) {
			/** 循环每一行,p表示行 */
			for (var p = 0; p < rowNumber; p++) {
				var tempStr = ""; // 表示每一次截取的字符串
				var start = p * provideNumber; // 开始截取的位置
				var end = start + provideNumber; // 结束截取的位置
				// 此处特殊处理最后一行的索引值
				if (p == rowNumber - 1) {
					// 最后一次不换行
					tempStr = params.substring(start, paramsNameNumber);
				} else {
					// 每一次拼接字符串并换行
					tempStr = params.substring(start, end) + "\n";
				}
				newParamsName += tempStr; // 最终拼成的字符串
			}

		} else {
			// 将旧标签的值赋给新标签
			newParamsName = params;
		}
		//将最终的字符串返回
		return newParamsName
	}
};